package com.linroid.sky31radio.module; import android.content.Context; import android.net.Uri; import com.google.gson.Gson; import com.linroid.sky31radio.BuildConfig; import com.linroid.sky31radio.R; import com.linroid.sky31radio.data.ApiService; import com.linroid.sky31radio.data.FirService; import com.squareup.okhttp.Cache; import com.squareup.okhttp.OkHttpClient; import com.squareup.okhttp.internal.DiskLruCache; import com.squareup.picasso.OkHttpDownloader; import com.squareup.picasso.Picasso; import java.io.File; import java.io.IOException; import java.util.concurrent.TimeUnit; import javax.inject.Named; import javax.inject.Singleton; import dagger.Module; import dagger.Provides; import retrofit.ErrorHandler; import retrofit.RestAdapter; import retrofit.RetrofitError; import retrofit.client.OkClient; import retrofit.converter.GsonConverter; import timber.log.Timber; /** * Created by linroid on 1/14/15. */ @Module( library = true, complete = false ) public class DataModule { @Provides @Singleton Gson provideGson(){ return new Gson(); } @Provides @Singleton Picasso providePicasso(OkHttpClient okHttpClient, Context ctx) { Picasso.Builder builder = new Picasso.Builder(ctx); builder.downloader(new OkHttpDownloader(okHttpClient)) .listener(new Picasso.Listener() { public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) { Timber.e(exception, "Picasso load image failed: " + uri.toString()); } }) .indicatorsEnabled(false) .loggingEnabled(false); return builder.build(); } @Provides @Singleton OkHttpClient provideOkHttp(Cache cache) { OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.setCache(cache); okHttpClient.setConnectTimeout(30, TimeUnit.SECONDS); return okHttpClient; } @Provides @Singleton Cache provideHttpCache(@Named("Http") File httpCacheDir) { //100M; int cacheSize = 1024*1024*100; try { return new Cache(httpCacheDir, cacheSize); } catch (IOException e) { e.printStackTrace(); }catch (Exception e){ Timber.e("install http cache false"); } return null; } @Provides @Singleton DiskLruCache provideDataCache(@Named("Data") File cacheDir){ DiskLruCache cache = null; try { //10M cache = DiskLruCache.open(cacheDir, BuildConfig.VERSION_CODE, 1, 1024 * 1024 * 10); } catch (IOException e) { e.printStackTrace(); Timber.e(e, "install data cache failed"); } return cache; } @Provides @Singleton RestAdapter provideRestAdapter(Gson gson, OkHttpClient okHttpClient, ErrorHandler errorHandler){ return new RestAdapter.Builder() .setErrorHandler(errorHandler) .setClient(new OkClient(okHttpClient)) .setConverter(new GsonConverter(gson)) .setLogLevel(RestAdapter.LogLevel.BASIC) .setEndpoint("http://radio.sky31.com/api") .build(); } @Provides @Singleton ErrorHandler provideErrorHandler(final Context ctx){ return new ErrorHandler() { @Override public Throwable handleError(RetrofitError retrofitError) { Timber.e(retrofitError, "请求出现错误:%s", retrofitError.getUrl()); RetrofitError.Kind kind = retrofitError.getKind(); String message; if(RetrofitError.Kind.NETWORK.equals(kind)){ message = ctx.getString(R.string.network_error); }else if(RetrofitError.Kind.HTTP.equals(kind)){ message = ctx.getString(R.string.http_error); }else if(RetrofitError.Kind.CONVERSION.equals(kind)){ message = ctx.getString(R.string.conversion_error); }else{ message = ctx.getString(R.string.unexpected_error); } return new Exception(message); } }; } @Provides @Singleton ApiService provideApiService(RestAdapter restAdapter){ return restAdapter.create(ApiService.class); } @Provides @Singleton FirService provideFirService(Gson gson, OkHttpClient okHttpClient, ErrorHandler errorHandler){ RestAdapter restAdapter = new RestAdapter.Builder() .setErrorHandler(errorHandler) .setClient(new OkClient(okHttpClient)) .setConverter(new GsonConverter(gson)) .setLogLevel(RestAdapter.LogLevel.BASIC) .setEndpoint("http://fir.im/api/v2") .build(); return restAdapter.create(FirService.class); } }